#pragma once
#include <iostream>
#include <string>
#include "Util.hpp"

//这里就不用之前写的策略模式的日志了，模仿思想写一个轻量级的即可！

typedef enum{
    INFO,
    DEBUG,
    WARNING,
    ERROR,
    FATAL
}LogLevel;

std::unordered_map<LogLevel, std::string> LogLevel2Str = {
    {INFO, "INFO"}, {DEBUG, "DEBUG"}, {WARNING, "WARNING"}, {ERROR, "ERROR"}, {FATAL, "FATAL"} 
};


std::ostream& Log(const std::string& level, const std::string& path_name, int line){
    std::string message;

    //1.我们需要把当前的日志等级加入
    message += "[";
    message += level;
    message += "]";

    //2.加入当前的文件路径(表示的是，在哪个路径打印的这条信息)
    message += "[";
    message += path_name;
    message += "]";

    //3.加入当前的行号
    message += "[";
    message += std::to_string(line);
    message += "]"; 
    
    //4.获取当前时间戳
    message += "[";
    message += std::to_string(TimeUtil::GetTimeStamp());
    message += "]"; 

    std::cout << message;
    return std::cout;
    //千万不要直接插入换行符、或者是endl！ 因为后序我们还要继续往里面插入！
}

//给上层用户使用的！
#define LOG(level) Log(LogLevel2Str[level], __FILE__, __LINE__)

//只不过需要注意，最后需要带上换行符！
//如：LOG(FATAL) << "SOCKET ERROR" << 